desc:Karlsen Filter
// Links //

http://basicsynth.com/index.php?page=filters&WEBMGR=a0684c791e5c08ee3365842c2659a6c3

slider11:0<0,3,{LP,HP,BP,BRej}>Filter Type
slider12:1000<20,22050,0.1>Frequency(Hz)
slider13:0<0,0.7,0.0001>Resonanse
slider14:0<-24,6,0.1>Gain dB

@init

/*     EEL:
Variables declared in the local() statement will be local to that function, 
and persist across calls of the function 
(though calls to a function from two different sections 
(such as @init and @sample) will have two different local states.
//---------------------------------------------------------------
   ,   ,   namespace .
      ,  .  .
 ,   local  instance   . */

function FilterK.Apply()
  instance(in_l, in_r, out_l, out_r, pass, f, q, p)
  local(pole0_l, pole1_l, pole2_l, pole3_l, pole4_l,
        pole0_r, pole1_r, pole2_r, pole3_r, pole4_r,
        oldpole0_l, oldpole1_l, oldpole2_l, oldpole3_l,
        oldpole0_r, oldpole1_r, oldpole2_r, oldpole3_r)
(  
  pole0_l = in_l - pole4_l*q;
  pole1_l = (pole0_l+oldpole0_l)*f - p*pole1_l;
  pole2_l = (pole1_l+oldpole1_l)*f - p*pole2_l;
  pole3_l = (pole2_l+oldpole2_l)*f - p*pole3_l;
  pole4_l = (pole3_l+oldpole3_l)*f - p*pole4_l;
  
  pole0_r = in_r - pole4_r*q;
  pole1_r = (pole0_r+oldpole0_r)*f - p*pole1_r;
  pole2_r = (pole1_r+oldpole1_r)*f - p*pole2_r;
  pole3_r = (pole2_r+oldpole2_r)*f - p*pole3_r;
  pole4_r = (pole3_r+oldpole3_r)*f - p*pole4_r;
    
  oldpole0_l = pole0_l;
  oldpole1_l = pole1_l;
  oldpole2_l = pole2_l;
  oldpole3_l = pole3_l;
  
  oldpole0_r = pole0_r;
  oldpole1_r = pole1_r;
  oldpole2_r = pole2_r;
  oldpole3_r = pole3_r;

  pass==0 ? (out_l = pole4_l;                   
             out_r = pole4_r; 
  ) :
  pass==1 ? (out_l = pole0_l - pole4_l;         
             out_r = pole0_r - pole4_r; 
  ) :
  pass==2 ? (out_l = pole1_l - pole4_l;         
             out_r = pole1_r - pole4_r; 
  ) :
  pass==3 ? (out_l = pole0_l + pole4_l-pole1_l; 
             out_r = pole0_r + pole4_r - pole1_r; 
  );

);


@slider
function FilterK.SetParameters(pass, cutoffFreq, resonance)
  instance(f, q, p)
(
  this.pass = pass; // 0=LP, 1=HP, 2=BP, 3=BRej
  this.cutoffFreq = cutoffFreq; // frequency Hz
  this.resonance = resonance;   // I use 0.6-0.7 max!
  
  f = sin(3.1415926*cutoffFreq/srate); // "/2"??? // frequency
  // the following two lines are a quick approx of q=r*e^(1-f)*loge(4)
  q = 1-f;
  q = resonance * (1 + q+q*q*0.5 + q*q*q*0.167) * 1.386294;
  p = f+f-1;
);

//----------------------------
FilterK.SetParameters(slider11, slider12, slider13);

out_gain = 10^(slider14/20);

@sample

FilterK.in_l = spl0;
FilterK.in_r = spl1;

FilterK.Apply();

spl0 = FilterK.out_l * out_gain;
spl1 = FilterK.out_r * out_gain;


